const axios = require('axios');

// 验证码存储（生产环境建议使用Redis）
const smsCodeStore = new Map();

// Spug短信推送配置
const SPUG_SMS_URL = 'https://push.spug.cc/send/4NbKBjz12WmpxWeP';

/**
 * 生成6位随机验证码
 */
function generateCode() {
  return Math.floor(100000 + Math.random() * 900000).toString();
}

/**
 * 发送短信验证码
 */
async function sendSmsCode(phone) {
  try {
    // 检查是否在10秒内已发送
    const lastSend = smsCodeStore.get(`time_${phone}`);
    if (lastSend && Date.now() - lastSend < 10000) {
      throw new Error('发送过于频繁，请10秒后再试');
    }

    // 生成验证码
    const code = generateCode();
    
    // 调用Spug短信推送服务
    console.log(`正在发送验证码到: ${phone}, 验证码: ${code}`);
    console.log(`Spug URL: ${SPUG_SMS_URL}`);
    
    const requestData = {
      // 按照 Spug 文档，使用 targets 动态设置推送对象（可多个，逗号分隔）
      targets: phone,
      // 兼容通用的短信验证码模板参数
      name: '酒吧管理系统',
      code: code,
      // 若模板支持自定义内容，也提供 content 变量（可在模板中引用）
      content: `【酒吧管理系统】您的验证码为${code}，5分钟内有效，请勿泄露。`
    };
    console.log('请求数据:', JSON.stringify(requestData, null, 2));
    
    const response = await axios.post(SPUG_SMS_URL, requestData, {
      headers: {
        'Content-Type': 'application/json'
      },
      timeout: 10000
    });
    
    console.log('Spug响应:', response.status, response.data);

    // 存储验证码，5分钟有效
    smsCodeStore.set(phone, {
      code: code,
      expire: Date.now() + 5 * 60 * 1000 // 5分钟
    });
    
    // 记录发送时间
    smsCodeStore.set(`time_${phone}`, Date.now());

    console.log(`验证码已发送到 ${phone}: ${code}`); // 开发环境日志
    return { success: true, message: '验证码已发送' };
  } catch (error) {
    console.error('发送短信失败:', error.message);
    
    // 如果是频繁发送错误，直接抛出
    if (error.message.includes('频繁')) {
      throw error;
    }
    
    // 短信服务失败时，仍然生成验证码（降级方案）
    const code = generateCode();
    smsCodeStore.set(phone, {
      code: code,
      expire: Date.now() + 5 * 60 * 1000
    });
    smsCodeStore.set(`time_${phone}`, Date.now());
    
    console.log(`[降级] 验证码（未发送短信）: ${phone} -> ${code}`);
    return { success: true, message: '验证码已生成（开发模式）', devCode: code };
  }
}

/**
 * 验证短信验证码
 */
function verifySmsCode(phone, code) {
  const stored = smsCodeStore.get(phone);
  
  if (!stored) {
    return { success: false, message: '验证码不存在或已过期' };
  }
  
  if (Date.now() > stored.expire) {
    smsCodeStore.delete(phone);
    return { success: false, message: '验证码已过期' };
  }
  
  if (stored.code !== code) {
    return { success: false, message: '验证码错误' };
  }
  
  // 验证成功后删除验证码
  smsCodeStore.delete(phone);
  smsCodeStore.delete(`time_${phone}`);
  
  return { success: true, message: '验证成功' };
}

/**
 * 清理过期验证码（定时任务）
 */
function cleanExpiredCodes() {
  const now = Date.now();
  for (const [key, value] of smsCodeStore.entries()) {
    if (key.startsWith('time_')) continue;
    if (value.expire && now > value.expire) {
      smsCodeStore.delete(key);
      smsCodeStore.delete(`time_${key}`);
    }
  }
}

// 每分钟清理一次过期验证码
setInterval(cleanExpiredCodes, 60000);

module.exports = {
  sendSmsCode,
  verifySmsCode
};
